假設今天想將應用服務部署在 k8s 叢集,第一步就是要為應用服務建立一個 image,再將它放在本地或 Docker Registry (如: DockerHub) 上。在叢集中,應用程式是以容器的形式部屬在一台或一組機器 (worker node) 上運行。因此,若要在叢集中執行程式必須先把他打包成容器的形式來作業。
第二步是叢集會從儲存庫中拉下應用程式的 image ,並建立容器把它封裝在 pod 中,一個 pod 就好比是一個應用程式的實例,也是 k8s 中的最小基本單位。
通常來說一個 pod 中會放一個容器,一個 pod 中也可以有多個容器。例如:一個 pod 存在 node.js app 容器跟提供 app 資料的容器。
例如一個容器是執行 web server、另一個容器(helper containers)提供 server 所需資料,彼此可以共享網路和儲存空間。
以下是跑一個 nginx 的範例。
一般來說會建立一個 YAML 格式的設定檔來建立 pod。
nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:latest
說明:
常用的 kind 與 apiVersion 的對應如下:
kind | apiVersion |
---|
Pod | v1 |
ReplicationController | v1 |
ReplicaSet | apps/v1 |
Deployment | apps/v1 |
Service | v1 |
使用 kubectl 命令來部署 pod
kubectl apply -f nginx.yaml
pod/nginx created
若沒有設定檔時也可以由 repository(DockerHub) 或私有的 repository 拉一個現有的 image 下來。(前提是你拉的那個是存在 Docker Hub 上)
kubectl run nginx --image=nginx
使用以下指令可以印出 yaml 格式的設定檔
kubectl get pod nginx -o yaml
建議是用 YAML 設定檔來建立 pod ,一來可以重複使用、二來有檔案可以方便閱讀與維護。
當部署後我們可以用以下指令來取得 pod 資訊:
kubectl get pods
:列出當前從叢中的 podskubectl describe pods <pod-name>
:列出 pod 的詳細資訊kubectl logs <pod-name>
:印出 pod 中容器的 logskubectl exec <pod-name> [flags]
:在容器中下指令檢查 pod 狀態
kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 35s
列出 pod 的詳細資訊
kubectl describe pods nginx
包含 pod 的名稱、哪個 node、有哪些 label 以及容器使用的 image
Name: nginx
Namespace: default
Priority: 0
Service Account: default
Node: minikube/192.168.49.2
Start Time: Fri, 22 Sep 2023 22:11:16 +0800
Labels: run=nginx
Annotations: <none>
Status: Running
IP: 10.244.0.4
IPs:
IP: 10.244.0.4
Containers:
nginx:
Container ID: docker://1c5b534c8013dfd6779be7d0af445bc3a465edc803040411f5c34f4a862f37af
Image: nginx
Image ID: docker-pullable://nginx@sha256:32da30332506740a2f7c34d5dc70467b7f14ec67d912703568daff790ab3f755
Port: <none>
Host Port: <none>
State: Running
Started: Fri, 22 Sep 2023 22:11:21 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-8tql6 (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
kube-api-access-8tql6:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 90s default-scheduler Successfully assigned default/nginx to minikube
Normal Pulling 89s kubelet Pulling image "nginx"
Normal Pulled 85s kubelet Successfully pulled image "nginx" in 3.753411808s (3.753422938s including waiting)
Normal Created 85s kubelet Created container nginx
Normal Started 85s kubelet Started container nginx
進入容器並使用 bash
kubectl exec -it nginx -- bash
列出容器當前目錄下檔案
root@nginx:/# ls
bin dev docker-entrypoint.sh home lib32 libx32 mnt proc run srv tmp var
boot docker-entrypoint.d etc lib lib64 media opt root sbin sys usr
刪除 pod
kubectl delete po nginx
pod "nginx" deleted
查看當前叢集的 pods
kubectl get po
No resources found in default namespace.